# -*- coding: utf-8 -*-
"""
Created on Fri Jun 14 18:04:58 2019
@author: 芥末酱
#本程序用于边缘检测

"""

#-------------------------------------1--------------------------------------
#机器学习进阶-阈值与平滑-图像平滑操作(去噪操作) 
'''
1. cv2.blur(均值滤波) 
2. cv2.boxfilter(方框滤波) 
3. cv2.Guassiannblur(进行高斯滤波) 
4. cv2.medianBlur(进行中值滤波)
'''
#-------------------------------------1--------------------------------------
import cv2  
import numpy as np
print("Hellow word!")     #打印“Hello word！”，验证模块导入成功

fn = "lena.jpg"
img = cv2.imread(fn)#导入图片，图片放在程序所在目录
#cv2.namedWindow("img-show", 2)   #创建一个窗口
#cv2.imshow('img-show', img)    #显示原始图片

#均值滤波
#即当对一个值进行滤波时，使用当前值与周围8个值之和，取平均做为当前值
mean = cv2.blur(img, (3, 3))
cv2.namedWindow("mean", 2)   #创建一个窗口
cv2.imshow('mean', mean)

#高斯模糊
#根据高斯的距离对周围的点进行加权,求平均值1，0.8， 0.6， 0.8
gaussian = cv2.GaussianBlur(img, (5, 5), 0) 
cv2.namedWindow("gaussian", 2)   #创建一个窗口
cv2.imshow('gaussian', gaussian)

#中值滤波
##将9个数据从小到大排列，取中间值作为当前值
median = cv2.medianBlur(img, 3)
cv2.namedWindow("median", 2)   #创建一个窗口
cv2.imshow('median', median)
#做一个合并显示
#imags = np.vstack((mean, gaussian, median))
#cv2.imshow('all', imags)
#cv2.waitKey(0)
#cv2.destroyAllWindows()
#-------------------------------------1--------------------------------------



#-------------------------------------2--------------------------------------
#转换为灰度图
out_img_GRAY=cv2.cvtColor(gaussian,cv2.COLOR_BGR2GRAY)#将图片转换为灰度图
cv2.namedWindow("img_GRAY", 2)   #创建一个窗口
cv2.imshow('img_GRAY', out_img_GRAY)    #显示原始图片


#使用Canny算子进行边缘检测
edge_output = cv2.Canny(out_img_GRAY, 10, 300)
cv2.namedWindow("Canny", 2)   #创建一个窗口
cv2.imshow('Canny', edge_output)    


#使用sobel算子进行边缘检测
sobel = cv2.Sobel(out_img_GRAY,-1,1,0,ksize=3)
cv2.namedWindow("sobel", 2)   #创建一个窗口
cv2.imshow('sobel', sobel) 

   
#使用laplacian算子进行边缘检测
laplacian = cv2.Laplacian(out_img_GRAY,-1)
cv2.namedWindow("laplacian", 2)   #创建一个窗口
cv2.imshow('laplacian', laplacian) 
#-------------------------------------2--------------------------------------

cv2.waitKey()

